【X68000(Z)アセンブラ講座 第007回 第004回のサンプルの最適化】 2025/01/22   今回はスプライトの表示について解説すると予告しましたが、 第004回のサンプルプログラムの最適化の方法を解説し忘れていたので 先に予定していた最適化の方法を解説します。 予定が狂って申し訳ありませんm(__)m 最適化には色々な方法がありますが 今回はその中の1例を説明します。 第004回のサンプルプログラムの中のサブルーチン'draw_bmp'の画像描画処理が サンプルプログラムとして速度を犠牲にして読みやすく書かれているので 最適化したプログラムに書き換えた'draw_bmp'ルーチンを↓に掲載します。 [ 最適化後の'draw_bmp'ルーチン ] -------------------------------------------------------------------------------- * Draw BMP draw_bmp: move.l #$C00000,a6 * CG-Vram先頭アドレスをa6に代入する lea bmp,a1 * a1にピクセルデータの先頭アドレスを代入する * moveq.l #0,d7 * d7にY座標を代入する move.w #512-1,d7 * [ 追加命令01 ] draw_bmp_1: * moveq.l #0,d6 * d6にX座標を代入する move.w #768/2-1,d6 * [ 追加命令02 ] movea.l a6,a5 * a6のアドレス値をa5にコピーする draw_bmp_2: move.b (a1),d0 * アドレスa1の[4bit+4bit=1byte]のピクセルデータd0に読み込む addq.l #1,a1 * a1に1を足して次のアドレスに更新する move.w d0,d1 * d0の値をd1にコピーする lsr.b #4,d0 * d0内の左の4ビットピクセルデータを使うために右に4bitシフト * and.b #%0000_1111,d0 * d0のデータの右4bitの状態を保持したまま他ビットを0にする move.w d0,(a5) * アドレスa5内のVRAMアドレスにd0のピクセルを置く addq.l #2,a5 * a5のアドレスに2を足して次のVRAMアドレスに更新する * and.b #%0000_1111,d1 * d1のデータの右4bitの状態を保持したまま他ビットを0にする move.w d1,(a5) * アドレスa5内のVRAMアドレスにd1のピクセルを置く addq.l #2,a5 * a5のアドレスに2を足して次のVRAMアドレスに更新する * addq.w #2,d6 * X座標d6に2を足す * cmp.w #768,d6 * d6の値と768を比較する * blt draw_bmp_2 * 比較結果が768未満ならdraw_bmp_2に飛ぶ dbpl d6,draw_bmp_2 * [ 追加命令03 ] add.l #1024*2,a6 * 次のY座標を処理するためにa6に横VRAMサイズ2048を足す * addq.w #1,d7 * Y座標d7に1を足す * cmp.w #512,d7 * d7と512を比較する * blt draw_bmp_1 * d7が512未満ならdraw_bmp_1に飛ぶ dbpl d7,draw_bmp_1 * [ 追加命令04 ] rts * 呼出元に戻る -------------------------------------------------------------------------------- 最適化前はX座標とY座標ともにそれぞれ足し算と比較と条件分岐の形で描画座標チェックしていましたが、 その方法だと読みやすいけど遅いプログラムと言う事になるので、 縦横それぞれループ命令だけでサイズ管理する事で描画速度を稼いでいる。 dbpl命令は指定のデータレジスターから1を引いても結果がプラスなら 指定のラベルに飛ぶと言う条件分岐です。 4命令削除で最適化されているはずです。 > * and.b #%0000_1111,d0 * d0のデータの右4bitの状態を保持したまま他ビットを0にする > * and.b #%0000_1111,d1 * d1のデータの右4bitの状態を保持したまま他ビットを0にする この2行をコメントにした理由は、 16色モードの時は下位4ビット以外のビットはVRAMに接続せず コメントにしてもマトモに色が出るからです。 2命令削除で更に最適化されているはずです。 今回は最適化の一例を示しましたが、 他にも最適化の方法があるかもしれませんが 何か良い最適化の方法が思い付いたら 是非ともコメントでお知らせください!! それでは、今回はこの辺で。 お互いにスキルアップしていきましょう。 * [ EOF ]